import re
from datetime import datetime
from typing import Tuple, List
from .medical_record import MedicalRecord


class QualityControl:
    """
    质控模块
    对提取的病历信息进行校验
    """
    
    def validate_record(self, record: MedicalRecord) -> Tuple[bool, List[str]]:
        """
        对病历记录进行质控校验
        
        Args:
            record (MedicalRecord): 病历记录对象
            
        Returns:
            Tuple[bool, List[str]]: (是否通过质控, 错误信息列表)
        """
        errors = []
        
        # 校验患者ID格式
        if not self._validate_patient_id(record.patient_id):
            errors.append("患者ID格式不正确，应为字母+8位数字")
        
        # 校验诊断结果是否非空
        if not self._validate_diagnosis(record.diagnosis):
            errors.append("诊断结果不能为空")
        
        # 校验检查报告日期格式
        if not self._validate_report_date(record.report_date):
            errors.append("检查报告日期格式不正确，应为YYYY-MM-DD")
        
        # 如果没有错误，则通过质控
        is_valid = len(errors) == 0
        
        return is_valid, errors
    
    def _validate_patient_id(self, patient_id: str) -> bool:
        """
        校验患者ID格式是否为"字母+8位数字"
        
        Args:
            patient_id (str): 患者ID
            
        Returns:
            bool: 是否符合格式要求
        """
        if not patient_id:
            return False
        
        # 使用正则表达式校验格式
        pattern = r'^[A-Za-z]\d{8}$'
        return bool(re.match(pattern, patient_id))
    
    def _validate_diagnosis(self, diagnosis: str) -> bool:
        """
        校验诊断结果是否非空
        
        Args:
            diagnosis (str): 诊断结果
            
        Returns:
            bool: 是否非空
        """
        if not diagnosis:
            return False
        
        # 检查是否只有空格
        return bool(diagnosis.strip())
    
    def _validate_report_date(self, report_date: str) -> bool:
        """
        校验检查报告日期是否为合法日期格式(YYYY-MM-DD)
        
        Args:
            report_date (str): 检查报告日期
            
        Returns:
            bool: 是否为合法日期格式
        """
        if not report_date:
            return False
        
        # 使用正则表达式校验基本格式
        date_pattern = r'^\d{4}-\d{2}-\d{2}$'
        if not re.match(date_pattern, report_date):
            return False
        
        # 进一步验证日期的有效性
        try:
            datetime.strptime(report_date, '%Y-%m-%d')
            return True
        except ValueError:
            return False